package zdori;

public class J01_Fundamentals {

	/**
	 * @param args
	 * OOP 프로그램을 개발할때 현실세계와 같은 객체 모델을 만들어야 함
	 * 예를 들어 급여 프로그램은 직원,세금,회사, 객체등이 있어야 함
	 * 
	 * 하지만 자바에서 객체는 유일한 데이터 형이 아님
	 * 기본(원시) 자료형
	 * 자바에서 기본 자료형은 모두 8가지가 있음
	 * 
	 * 처음 6개의 기본 자료형은 숫자를 나타냄
	 * byte,short,int,long,float,double
	 * 
	 * 자연수, 정수 : byte,short,int,long
	 * 소수점이 있는 정수 : float,double
	 * 
	 * char : 단일 문자 저자잇 사용
	 * boolean : 논리값(참/거짓) 저장시 사용
	 * 프로그램 작성시 사용하는 자료의 크기에 따라 자료형을 적절히 선택
	 * 
	 * 변수 varable
	 * 데이터가 저장될 장소를 의미
	 * 자바는 엄격하게 자료형을 검사하는 언어임
	 * 따라서 모든 변수는 자료형이 선언되어야 함
	 * 각각의 변수를 구분하기 위해 변수에 이름을 부여
	 * 이것을 변수명, 식별자 identifier라 한다
	 * 
	 * 변수의 명명법
	 * 식별자는 자바 문자와 자바 숫자로만 구성, 길이는 무제한, 단, 식별자의 첫 글자는 문자이어야 함
	 * 식별자는 자바의 예약어, boolean 리터럴, null 리터럴이면 안됨
	 * 식별자는 특정 범위 scope 내에서 유일해야 함(중복 불가)
	 * 식별자는 대/소문자를 구분함(x2,X2 는 서로 다름)
	 * 
	 * 자바 문자/자바 숫자
	 * 자바문자는 ASCII 문자 집합의 소/대 영문자
	 * 달러$ 문자와 밑줄 _ 문자를 의미
	 * 자바 숫자는 ASCII 문자 집합의 숫자 0-9를 의미
	 * 
	 * 
	 * 리터럴 literal
	 * 가끔 프로그램상에서 변수에 값을 할당할 때가 있음
	 * 예를 들어 int에 숫자 2나 char에 문자 'a' 처럼 변수에 값을 할당할때 , 이값은 컴파일러가
	 * 이해할 수 있는 형식으로 표현해야함
	 * 소스코드상의 값 표현법을 리터럴이라 함
	 * 종류는 기본자료형 리터럴
	 * 문자열 String 리터럴, 널 null 문자 리터럴
	 * 
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		//변수 선언 및 값 할당
		//[자료형][변수명]=[리터럴];
		/*
		//변수 및 자료형 선언
		//[자료형][변수명];
		short birthyear;		//생년(정수)
		int birth_year;
		float pi;				//원주율
		long jumin;			//주민번호
		char first_name;		//이름
		char middle_name;
		char last_name;
		char grade;			//학점
		boolean isMale;		//성별
		boolean isMarried;//결혼여부
		
		//변수에 값 할당
		//변수명 = 리터럴(값);
		
		birthyear = 1982;
		birth_year = 1982;
		//pi = 3.14;		//오류발생
		//실수 리터럴은 기본적으로 double 형으로 인식
		//double 형 값을 float 형 변수에 담으려하니 오류발생
		//따라서 float 리터럴 임을 의미하는 접미사 f 를 추가 필요
		pi = 3.14f;
		//jumin = 198207202120856;  //오류발생
		//정수 리터럴은 기본적으로 int 형으로 인식
		//int 형 값을  long 형 변수에 담으려 하면 오류발생
		//따라서 long 리터럴임을 의미하는 접미사 l 을 추가
		jumin = 198207202120856l;
		
		first_name = '김';		//문자
		middle_name = '혜';
		last_name = '현';
		
		grade = '수';
		
		isMale = true;
		isMarried = false;
		*/
		
		short birthyear =1982;						//생년(정수)
		int birth_year = 1982;
		float pi  = 3.14f;								//원주율
		long jumin = 198207202120856l;			//주민번호
		char first_name = '김';							//이름
		char middle_name = '혜';
		char last_name = '현';
		char grade = '수'; 								//학점
		boolean isMale = true;						//성별
		boolean isMarried =  false;					//결혼여부
		
		//변수 값 출력
		//자바표준 출력문 System.out.println(); 사용
		System.out.println(birthyear);
		System.out.println(birth_year);
		System.out.println(pi);
		System.out.println(jumin);
		System.out.println(first_name);
		System.out.println(middle_name);
		System.out.println(last_name);
		System.out.println(grade);
		System.out.println(isMale);
		System.out.println(isMarried);
		
		 // 동일한 자료형을 가지는 변수는
		 // , 를 이용해서 다중 변수 선언이 가능
		 // 하지만, 가독성이 떨어지기 때문에 비추!
		
		  char code1 = '\uC790';		// 유니코드 
		  char code2 = '\uBC14'; 
		  char symbol1 = '\u263A'; 	// 기호
		  char symbol2 = '\u2639';
		
		// 변수 값 출력
		// 자바 표준 출력문 System.out.println() 사용
		// System.out.println( 변수명 );
		System.out.println( birthyear );
		System.out.println( code1 );
		System.out.println( code2 );
		System.out.println( symbol1 );
		System.out.println( symbol2 );
		
		
		//연산자 우선순위
		int g = 1;
		int h = 2;
		int i = 3;
		int j = g+h*i;
		//모든 연산자에는 우선순위가 있음
		//가장 높은 우선 순위는 (),++,--
		
		int k = 5;
		int l = 5;
		boolean m = k+5 == l+20;
		
		//승격 prokotion
		byte n = 5;
		
		//놀랍게도 오류발생
		//단항연산자 - 에 의해 n 변수가 int 형으로 승격
		//문제 해결을 위해 명시적 축소 형변환 사용하거나
		//변수를 int 형으로 바꾸면 됨
		byte o = (byte)-n;
		int p = -n;
		
		short q = 100;
		short r = 200;
		//short s = q + r;
		//이항연산자 + 에 의해
		//q,r 변수가 int 형으로 승격
		short s = (short)(q+r);
		int t = (q+r);
		
		//주석 comment
		//프로그램 코드에 
		//컴파일러가 소스를 컴파일 할때
		//주석은 무시하고 넘어감
		//해당 코드가 제공하는 기능,용도,의미를 쉽게 파악하도록 하기위해 주석을 다는것은
		//좋은 습관임
		//자바에서는 2가지 주석 유형 제공 C ,C++ 과 유사
		//전통적인 주석은 /* 와 */ 사이에 주석을 작성
		// 주의) 중첩해서 사용하면 안됨
		//한줄 주석인 // 는 코드 끝에 작성하는 주석
		
		
		//연결join 연산자 + (concatenate)
		//일반적으로 + 연산자는 두 수를 더하는 기능을 가짐
		//하지만, 문자나 문자열에 + 연산자를 사용하면
		//앞의 문자와 뒤의 문자를 연결 (합치는)해 줌
		
		char u = '가';
		char v = '나';
		System.out.println(u);
		System.out.println(v);
		System.out.println(u+v);		//승격으로 인해 숫자 출력
		System.out.println(""+u+v);
		//하지만 ,문자에 사용하는 +연산자로 인한 오버헤드 때문에 StringBuilder 클라스를 주로 사용
		
	}

}
